package main

import "fmt"

// 空接口 是泛型概念，可以表示所有类型
// 没有任何方法定义的接口就是空接口，空接口没有任何约束，因此所有变量都可以实现空接口

// 空接口作为参数的函数
// eg: 如a是int 类型，那么a传值是从空接口类型转成int类型，之后才能使用int的特性
// show 输出参数的值
func show(a interface{}) {
	fmt.Println(a)
}

func main() {
	show(20)
	show("abs")
	// 数组
	show([]int{1, 2, 3})
	//	切片
	slice := []interface{}{"zhangsan", 27, "male"}
	show(slice)
	//map声明语法：	map[key类型]value类型
	mp := map[string]interface{}{
		"username": "john",
		"age":      20,
	}
	show(mp)

	// 接口值是由一个具体类型和具体类型的值所组成；分别称其为接口的动态类型和动态值
	// 如果想判断空接口中值的类型，可以使用类型断言

	// 语法 x.(T); x 表示类型为 interface() 的变量、 T表示断言 x 可能是的类型

	//	类型断言的方法
	var x interface{}
	x = "heloo you"
	v, ok := x.(string)
	if ok {
		fmt.Println("correctly judge", v)
	} else {
		fmt.Println("not string type")
	}

}
